package body Commandes is

    function Get_Piece_Assoc (Comm : Commande) return Ptr_Piece is
    begin
        return Comm.Piece_Assoc;
    end Get_Piece_Assoc;

	function Get_Piece_Assoc (Comm : Commande) return Piece is
	begin
		return Comm.Piece_Assoc.all;
	end Get_Piece_Assoc;
    
    function Get_Id (Comm : Commande) return Natural is
    begin
        return Comm.Id;
    end Get_Id;
    
    function Get_Client (Comm : Commande) return String is
    begin
        return Comm.Client;
    end Get_Client;
    
	function Get_Etat (Comm : Commande) return Etat_Commande is
	begin
		return Comm.Etat;
	end Get_Etat;
	
	procedure Set_Etat (Comm : in out Commande; Etat : in Etat_Commande) is
	begin
		Comm.Etat := Etat;
	end Set_Etat;
    
    function Creer (Id : Natural;
                    Client : String;
                    Cat : Categorie_Verre;
                    Taille : Dimension) return Commande is
    begin
        return (Id, Client, Piece_Assoc => Creer(Cat, Taille, Id), Etat => 'A');
    end Creer;
    
    
    function Creer (Id : Natural; Client : String; Etat : Etat_Commande) return Commande is
    begin
        return (Id, Client, Piece_Assoc => Null, Etat => Etat);
    end Creer;
    
    function Verifier (Verre : Categorie_Verre; Largeur : Natural; Hauteur : Natural) return Etat_Commande is
    	Taille_Maxi, Taille_Mini, Taille_Piece : Dimension;
    begin
        if not (Liste_Categories.Appartient(Verre)) then
            return 'c';
        else
            Taille_Maxi := Categories.Get_Taille(Liste_Categories.Get_Categorie(Verre));
            Taille_Mini := Categories.Get_Dim_Piece_Mini(Liste_Categories.Get_Categorie(Verre));
            Taille_Piece := Dim(Largeur, Hauteur);
        	
			if not(Taille_Piece < Taille_Maxi) then
				return 'g';
			elsif not(Taille_Mini < Taille_Piece) then
				return 'p';
			else
			    -- La piece est correcte
				return 'A';
			end if;
        end if;
    end Verifier;
    
    function Copie (Src : Commande) return Commande is
    begin
        if Src.Piece_Assoc = Null then
            return Commande'(Src.Id, Src.Client, Null, Src.Etat);
        else
            return Commande'(Src.Id, Src.Client, Pieces.Creer(Src.Piece_Assoc.all), Src.Etat);
        end if;
    end Copie;
    
    function En_Attente (Comm : Commande) return Boolean is
    begin
        return Get_Etat(Comm) = 'A';
    end En_Attente;

    function Erronee (Comm : Commande) return Boolean is
    begin
        return (Get_Etat(Comm) /= 'A') and (Get_Etat(Comm) /= 'S');
    end Erronee;

	function ToString (Comm : Commande) return String is
	begin
		return ("COMMANDE " & Natural_To_Str(Comm.Id) & 
		        " ~ État : " & Comm.Etat & " Client : " & Comm.Client &
		        ASCII.LF & Fg(Cyan) & ToStringPtr(Get_Piece_Assoc(Comm)) & Fg & ASCII.LF);
	end ToString;

end Commandes;